package cn.wolfcode.luowowo.service.impl;

import cn.wolfcode.luowowo.QueryObject.DestinationQuery;
import cn.wolfcode.luowowo.domain.Destination;
import cn.wolfcode.luowowo.domain.Region;
import cn.wolfcode.luowowo.respository.DestinationRespository;
import cn.wolfcode.luowowo.service.IDestinationService;
import cn.wolfcode.luowowo.service.IRegionService;
import cn.wolfcode.luowowo.util.DBHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.*;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;

@Service
//@Transactional  暂时不管事务
public class DestinationServiceImpl implements IDestinationService {

    @Autowired
    private DestinationRespository destinationRespository;

    @Autowired
    private MongoTemplate mongoTemplate;

    @Autowired
    private IRegionService regionService;

    @Override
    public Destination get(String id) {
        Optional<Destination> optional = destinationRespository.findById(id);
        if (optional.isPresent()) {
            return optional.get();
        }
        return null;
    }

    @Override
    public List<Destination> list() {
        return destinationRespository.findAll();
    }

    @Override
    public Page<Destination> query(DestinationQuery qo) {
        Query query = new Query();
        //根据有无parentId 查询对应的目的地
        if (!StringUtils.hasLength(qo.getParentId())) {
            query.addCriteria(Criteria.where("parentId").is(""));
        } else {
            query.addCriteria(Criteria.where("parentId").is(qo.getParentId()));
        }
        //关键字查询
        if (StringUtils.hasLength(qo.getKeyword())) {
            query.addCriteria(Criteria.where("name").regex(".*" + qo.getKeyword() + ".*"));
        }
        //使用工具类 分页查询
        return DBHelper.query(mongoTemplate, Destination.class, query, qo.getPageable());
    }

    @Override
    public List<Destination> getDestByDeep(int deep) {
        List<Destination> list = destinationRespository.findByDeepLessThanEqual(deep);
        return list;
    }


    //根>>中国>>广东>>广州:   parentId: 广州id
    //getToast方法 获取导航吐司 ------>(使用了while循环)
    /*@Override
    public List<Destination> getToast(String parentId) {
        if (!StringUtils.hasLength(parentId)) {
            return Collections.emptyList();
        }
        ArrayList<Destination> list = new ArrayList<>();
        while (StringUtils.hasLength(parentId)) {
            //根据parentId 查询目的地
            Optional<Destination> op = destinationRespository.findById(parentId);
            list.add(op.get());
            parentId = op.get().getParentId();
        }
        Collections.reverse(list);//集合翻转
        return list;
    }*/

    @Override
    //根>>中国>>广东>>广州:   parentId: 广州id
    //getToast方法 获取导航吐司---->使用递归
    public List<Destination> getToast(String parentId) {
        if (!StringUtils.hasLength(parentId)) {
            return Collections.emptyList();
        }
        ArrayList<Destination> list = new ArrayList<>();
        //调用方法 根据parentId 获取对应目的地 添加进集合中
        createToast(list, parentId);
        Collections.reverse(list);//集合翻转
        return list;
    }

    private void createToast(ArrayList<Destination> list, String parentId) {
        Optional<Destination> op = destinationRespository.findById(parentId);
        if (!op.isPresent()) {
            return;
        }
        list.add(op.get());
        if (StringUtils.hasLength(op.get().getParentId())) {
            //如果当前目的地对象的parentId有值  递归调用方法
            createToast(list, op.get().getParentId());
        }
    }

    @Override
    public void delete(String id) {
        destinationRespository.deleteById(id);
    }

    @Override
    public List<Destination> getDescByRegionForApi(String regionId) {
        List<Destination> list = null;

        //第一层: 关联的目的地
        //区分国内的目的地 regionId=-1
        if ("-1".equals(regionId)) {
            //查询中国的所有省份
            list = destinationRespository.findByParentName("中国");
        } else {
            //查询区域挂载的目的地
            Region region = regionService.get(regionId);//获取区域
            List<String> refIds = region.getRefIds();//获取区域对象的refIds
            list = destinationRespository.findByIdIn(refIds);
        }

        //第二层: 关联目的地下面 的子目的地
        for (Destination dest : list) {
            //Jpa 使用 加一个PageRequest对象 可以限定查询的范围
            PageRequest of = PageRequest.of(0, 5);
            //拿到安徽的id  根据安徽的id作为parentId来查 得到安徽下面的儿子
            List<Destination> children = destinationRespository.findByParentId(dest.getId(), of);
            dest.setChildren(children);
        }
        return list;
    }

    @Override
    public List<Destination> getDestByRegionId(String rid) {
        //先查询该区域上 挂载的目的地id集合
        Region region = regionService.get(rid);//查询区域
        List<String> refIds = region.getRefIds();//获取区域对象的refIds
        return destinationRespository.findByIdIn(refIds);
    }

    @Override
    public Destination getByName(String destName) {
        return destinationRespository.findByName(destName);
    }


}
